package biblio;
//VERNAY OLIVIER -> PROJET OMGL GESTION DOC
import java.io.Serializable;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Observable;

/**
 * Classe de gestion d'Periodique.
 * @author IUT, refactor� par E. Ceret
 * @version 2.0
 */
public class Periodique extends Observable implements Serializable {

	// ************************************************************************************************************
	// Constantes
	// ************************************************************************************************************

	private static final long serialVersionUID = 1L;
	
	// ************************************************************************************************************
	// Attributs
	// ************************************************************************************************************

	private String _issn;
	private String _nomPeriodique;
	private String _editeurPeriodique;
	private int _derParution;

	// Attributs d'Association
//////
	private HashMap<Integer, Parution> _parutions;
//////
	// ************************************************************************************************************
	// Constructeur
	// ************************************************************************************************************

	/**
	 * Constructeur. 
	 * @param issn					numero ISsN de l'Periodique
	 * @param nomPeriodique			nom du Périodique
	 * @param editeurPeriodique		editeur de l'Periodique
	 */
	public Periodique(String issn, String nomPeriodique , String editeurPeriodique) {
		
		this.setIsbn(issn);
		this.setNomPeriodique(nomPeriodique);
		this.setEditeurPeriodique(editeurPeriodique);
/////
		this.setParution(new HashMap<Integer, Parution>());
/////
		
	} // Fin Constructeur

	// ************************************************************************************************************
	// M�thodes priv�es
	// ************************************************************************************************************
	
	// ------------------------------------------------------------------------------------------------------------
	// Affecteurs
	

	/**
	 * setter de l'attribut editeurPeriodique
	 * @param editeurPeriodique valeur � affecter � l'�diteur du Periodique
	 */
	private void setEditeurPeriodique(String editeurPeriodique){
		_editeurPeriodique = editeurPeriodique;
	}

	/**
	 * setter de l'attribut ISSN
	 * @param issn valeur � affecter � L'issn du Periodique
	 */
	private void setIsbn(String issn) {
		this._issn = issn;
	}

	/**
	 * setter de l'attribut nomPeriodique
	 * @param nomPeriodique valeur � affecter au nom du Periodique
	 */
	private void setNomPeriodique(String nomPeriodique){
		_nomPeriodique = nomPeriodique;
	}
	
	/**
	 * setter de l'attrribut parution (ensemble des parution du périodique)
	 * @param parution hashmap de periodique
	 */
	public void setParution(HashMap<Integer, Parution> parutions) {
		_parutions = parutions;
	}
	
	private void setDerParution(int derParution) {
		_derParution  = derParution ;
	}
	
	/**
	 * getter du dernier num�ro d'exemplaire
	 * @return un entier repr�sentant le dernier num�ro d'exemplaire de l'ouvrage
	 */
	private int getDerParution() {
		return _derParution;
	}
	
	private int genererNumeroParution() {
		this.setDerParution(this.getDerParution() + 1);
		return this.getDerParution();
	} // Fin genererNumeroExemplaire
	// ------------------------------------------------------------------------------------------------------------
	// Traitements
/////
	/**
	 * Lie un exemplaire � l'Periodique. Ins�re un exemplaire dans l'ensemble des exemplaires de l'Periodique, avec son numero.
	 * @param numero numero de l'exemplaire � ins�rer
	 * @param exemplaire exemplaire � ins�rer
	 */
	private void lierParution(int numero, Parution parution) {
		_parutions.put(numero, parution);
	} // Fin lierExemplaire

	
/////
	
	// ************************************************************************************************************
	// M�thodes publiques
	// ************************************************************************************************************

	// ------------------------------------------------------------------------------------------------------------
	// Accesseurs
	
	/**
	 * Getter de l'ISsN.
	 * @return ISsN du Periodique
	 */
	public String getIssn() {
		return _issn;
	}

	/**
	 * Getter nom de periodique.
	 * @return nom du Periodique
	 */
	public String getNomPeriodique() {
		return _nomPeriodique;
	}


	/**
	 * getter de l'editeur.
	 * @return editeur du Periodique
	 */
	public String getEditeurPeriodique() {
		return _editeurPeriodique;
	}



/////
	/**
	 * getter d'un exemplaire de l'Periodique.
	 * @param numero numero de l'exemplaire retourn�
	 * @return l'exemplaire dont le num�ro a �t� pass� en param�tre, s'il existe
	 */
	public Parution getParution(int numero) {
		return (Parution) _parutions.get(numero);
	} // Fin unExemplaire
/////
	/**
	 * getter de l'ensemble des exemplaires.
	 * @return une collection d'exemplaires
	 */
	public Collection<Parution> getParutions() {
		return _parutions.values();
	}
/////

	// ------------------------------------------------------------------------------------------------------------
	// Traitements

	/**
	 * Ajout d'un exemplaire � l'Periodique. Le num�ro de cet exemplaire est g�n�r� automatiquement pour l'Periodique.
	 * @param dateReception date � laquelle l'exemplaire a �t� re�u.
	 */
	public void ajouterParution(String nomParution,String identifiantParution,GregorianCalendar dateReception) {
		// Generation du numero chronologique de l'exemplaire
		int numero = this.genererNumeroParution();
		
		// Creation de l'exemplaire
		Parution parution = new Parution(nomParution, identifiantParution, dateReception);
		
		// liaison de l'Periodique a l'exemplaire
		this.lierParution(numero, parution);
		
	} // Fin ajouterParution



	
//////////////////////////
	//FIN AJOUT OLIVIER
//////////////////////////

	
} // Fin Classe Periodique
